package com.yupi.springbootinit.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yupi.springbootinit.model.dto.attachment.AttachmentQueryRequest;
import com.yupi.springbootinit.model.dto.attachment.AttachmentUpdateRequest;
import com.yupi.springbootinit.model.entity.Attachment;
import com.yupi.springbootinit.model.vo.AttachmentVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 附件服务
 */
public interface AttachmentService extends IService<Attachment> {

    /**
     * 上传附件
     *
     * @param file     文件
     * @param bizType  业务类型
     * @param bizId    业务ID
     * @param fileCategory 文件分类
     * @param node     业务节点
     * @param remark   备注
     * @param uploaderId 上传人ID
     * @param uploaderName 上传人姓名
     * @return 附件信息
     */
    Attachment uploadFile(MultipartFile file, String bizType, Long bizId, 
                         String fileCategory, String node, String remark,
                         Long uploaderId, String uploaderName);

    /**
     * 批量上传附件
     *
     * @param files    文件列表
     * @param bizType  业务类型
     * @param bizId    业务ID
     * @param fileCategory 文件分类
     * @param node     业务节点
     * @param remark   备注
     * @param uploaderId 上传人ID
     * @param uploaderName 上传人姓名
     * @return 附件信息列表
     */
    List<Attachment> batchUploadFiles(List<MultipartFile> files, String bizType, Long bizId,
                                     String fileCategory, String node, String remark,
                                     Long uploaderId, String uploaderName);

    /**
     * 根据业务信息查询附件
     *
     * @param bizType 业务类型
     * @param bizId   业务ID
     * @return 附件列表
     */
    List<Attachment> getAttachmentsByBiz(String bizType, Long bizId);

    /**
     * 根据业务信息和文件分类查询附件
     *
     * @param bizType      业务类型
     * @param bizId        业务ID
     * @param fileCategory 文件分类
     * @return 附件列表
     */
    List<Attachment> getAttachmentsByBizAndCategory(String bizType, Long bizId, String fileCategory);

    /**
     * 根据业务信息、文件分类和节点查询附件
     *
     * @param bizType      业务类型
     * @param bizId        业务ID
     * @param fileCategory 文件分类
     * @param node         业务节点
     * @return 附件列表
     */
    List<Attachment> getAttachmentsByBizAndCategoryAndNode(String bizType, Long bizId, 
                                                          String fileCategory, String node);

    /**
     * 删除附件（软删除）
     *
     * @param attachmentId 附件ID
     * @param deletedBy    删除人ID
     * @return 是否成功
     */
    boolean deleteAttachment(Long attachmentId, Long deletedBy);

    /**
     * 批量删除附件（软删除）
     *
     * @param attachmentIds 附件ID列表
     * @param deletedBy     删除人ID
     * @return 是否成功
     */
    boolean batchDeleteAttachments(List<Long> attachmentIds, Long deletedBy);

    /**
     * 获取查询条件
     *
     * @param attachmentQueryRequest 查询请求
     * @return 查询条件
     */
    QueryWrapper<Attachment> getQueryWrapper(AttachmentQueryRequest attachmentQueryRequest);

    /**
     * 获取附件VO
     *
     * @param attachment 附件
     * @return 附件VO
     */
    AttachmentVO getAttachmentVO(Attachment attachment);

    /**
     * 分页获取附件VO
     *
     * @param attachmentPage 附件分页
     * @return 附件VO分页
     */
    Page<AttachmentVO> getAttachmentVOPage(Page<Attachment> attachmentPage);

    /**
     * 校验文件
     *
     * @param file 文件
     */
    void validateFile(MultipartFile file);

    /**
     * 格式化文件大小
     *
     * @param fileSize 文件大小（字节）
     * @return 格式化后的文件大小
     */
    String formatFileSize(Integer fileSize);

    /**
     * 物理删除附件（删除数据库记录和本地文件）
     *
     * @param attachmentId 附件ID
     * @param deletedBy    删除人ID
     * @return 是否成功
     */
    boolean physicalDeleteAttachment(Long attachmentId, Long deletedBy);

    /**
     * 批量物理删除附件（删除数据库记录和本地文件）
     *
     * @param attachmentIds 附件ID列表
     * @param deletedBy     删除人ID
     * @return 是否成功
     */
    boolean batchPhysicalDeleteAttachments(List<Long> attachmentIds, Long deletedBy);

    /**
     * 更新附件信息（支持修改分类时同步移动文件）
     *
     * @param attachmentId  附件ID
     * @param fileCategory  新文件分类
     * @param node         新业务节点
     * @param remark       新备注
     * @param updatedBy    更新人ID
     * @return 是否成功
     */
    boolean updateAttachmentInfo(Long attachmentId, String fileCategory, String node, String remark, Long updatedBy);

    /**
     * 批量更新附件信息
     *
     * @param updateRequests 更新请求列表
     * @param updatedBy     更新人ID
     * @return 是否成功
     */
    boolean batchUpdateAttachments(List<AttachmentUpdateRequest> updateRequests, Long updatedBy);

    /**
     * 替换附件文件（保持ID不变，替换实际文件）
     *
     * @param attachmentId 附件ID
     * @param newFile      新文件
     * @param updatedBy    更新人ID
     * @return 更新后的附件信息
     */
    Attachment replaceAttachmentFile(Long attachmentId, MultipartFile newFile, Long updatedBy);
}
